<?php

App::import('Sanitize');

class PlanosController extends AppController {

    var $name = 'Planos';
    var $paginate = array(
        'recursive' => 0,
        'order' => array('Plano.id ASC'),
        'limit' => 10,
    );

    function beforeFilter() {
        //$this->Auth->allow();
    }

    function __mime_content_type($filename) {
        $mime_types = array(
            'txt' => 'text/plain',
            // archives
            'zip' => 'application/zip',
            'rar' => 'application/x-rar-compressed',
            // adobe
            'pdf' => 'application/pdf',
            // ms office
            'doc' => 'application/msword',
            'rtf' => 'application/rtf',
            'xls' => 'application/vnd.ms-excel',
            'ppt' => 'application/vnd.ms-powerpoint',
            // open office
            'odt' => 'application/vnd.oasis.opendocument.text',
            'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
        );

        $ext = strtolower(array_pop(explode('.', $filename)));
        if (array_key_exists($ext, $mime_types)) {
            return true;
        } else {
            return false;
        }
    }

    function add_plano() {
        $this->__aux_add_plano();
    }

    function admin_add_plano() {
        $this->__aux_add_plano();
    }

    /**
     * Permite dar de alta un nuevo plano de una obra de arte
     */
    function __aux_add_plano() {
        $this->layout = false;

        if ($this->Session->check('id_obra')) {
            $obra_id = $this->Session->read('id_obra');
            if (!empty($this->data)) {
                $this->data['Plano']['obra_id'] = $obra_id;
                $this->__save_plano($obra_id, $this->data, $_FILES);
            }
            $referer = $this->referer();
            $this->set(compact('referer'));
            $this->render('add_plano');
        } else {
            $mensaje = 'Para poder cargar planos, primero debe dar de alta una obra de arte en la sopala "General"';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function view_planos() {
        $this->__aux_view_planos();
    }

    function admin_view_planos() {
        $this->__aux_view_planos();
    }

    /**
     * Lista todos los planos de la obra que se está dando de alta
     */
    function __aux_view_planos() {
        $this->layout = false;
        $obra_id = ($this->Session->check('id_obra')) ? $this->Session->read('id_obra') : 0;
        $obra = $this->Plano->Obra->findById($obra_id);
        $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';

        $this->set('obra_nombre', $obra_nombre);
        $this->set('planos', $this->paginate('Plano', array('Plano.obra_id' => $obra_id)));
        $this->render('view_planos');
    }

    function delete_plano($id = null) {
        $this->__aux_delete_plano($id);
    }

    function admin_delete_plano($id = null) {
        $this->__aux_delete_plano($id);
    }

    /**
     * Elimina un plano determinado de la db y su archivo físico correspondiente
     */
    function __aux_delete_plano($id = null) {
        $this->layout = false;
        $this->Plano->begin();
        if (!empty($id)) {
            $datos_plano = $this->Plano->findById($id, array('recursive' => 0));
            if (!empty($datos_plano)) {
                if ($this->Plano->delete($id)) {
                    $plano_ext = end(explode('.', $datos_plano['Plano']['nombre']));
                    $plano_nombre = $datos_plano['Plano']['obra_id'] . '_' . $datos_plano['Plano']['id'] . '.' . $plano_ext;
                    $archivo_plano = dirname(dirname(__FILE__)) . '\files\planos\\' . $plano_nombre;
                    if (is_file($archivo_plano)) {
                        if (@unlink($archivo_plano)) {
                            $this->Plano->commit();
                            echo 'El plano "' . $datos_plano['Plano']['nombre'] . '" se eliminó correctamente.';
                            exit;
                        } else {
                            // El archivo no se pudo eliminar
                            $this->Plano->rollback();
                            echo 'Error: El archivo no se pudo eliminar.';
                            exit;
                        }
                    } else {
                        // No se encontró el archivo pero eliminamos igual el plano de la db
                        $this->Plano->commit();
                        echo 'El plano "' . $datos_plano['Plano']['nombre'] . '" se eliminó correctamente.';
                        exit;
                    }
                } else {
                    // El plano no se pudo eliminar de la db
                    $this->Plano->rollback();
                    echo 'Error: El plano no se pudo eliminar.';
                    exit;
                }
            } else {
                // No se encontró el plano en la db
                $this->Plano->rollback();
                echo 'Error: No se encontró el plano en la db.';
                exit;
            }
        }
    }

    function edit_plano($obra_id = null) {
        $this->__aux_edit_plano($obra_id);
    }

    function admin_edit_plano($obra_id = null) {
        $this->__aux_edit_plano($obra_id);
    }

    /**
     * Permite editar un plano de una obra de arte
     */
    function __aux_edit_plano($obra_id = null) {
        $this->layout = false;
        if (!empty($this->data)) {
            $obra_id = (isset($this->data['Plano']['obra_id']) && (!empty($this->data['Plano']['obra_id']))) ? $this->data['Plano']['obra_id'] : 0;
            $this->__save_plano($obra_id, $this->data, $_FILES);
        }
        $referer = $this->referer();
        $this->set(compact('obra_id', 'referer'));
        $this->render('edit_plano');
    }

    function view_edit_planos($obra_id = null) {
        $this->__aux_view_edit_planos($obra_id);
    }

    function admin_view_edit_planos($obra_id = null) {
        $this->__aux_view_edit_planos($obra_id);
    }

    /**
     * Lista todos los planos de la obra que se está editando
     */
    function __aux_view_edit_planos($obra_id = null) {
        $this->layout = false;
        if (!empty($obra_id)) {
            $obra = $this->Plano->Obra->findById($obra_id);
            $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';

            $this->set('obra_nombre', $obra_nombre);
            $this->set('planos', $this->paginate('Plano', array('Plano.obra_id' => $obra_id)));
            $this->render('view_edit_planos');
        }
    }

    function read_plano($id = null) {
        $this->__aux_read_plano($id);
    }

    function admin_read_plano($id = null) {
        $this->__aux_read_plano($id);
    }

    /**
     * Recupera un plano de la db y devuelve su información
     * como un string separado por "|":
     * id|obra_id|nombre|titulo|comentario|inicial
     */
    function __aux_read_plano($id = null) {
        $plano = '';
        if (!empty($id)) {
            $elemento = $this->Plano->findById($id, array('recursive' => 0));
            if (!empty($elemento)) {
                $plano = $elemento['Plano']['id'] . '|' .
                        $elemento['Plano']['obra_id'] . '|' .
                        $elemento['Plano']['nombre'] . '|' .
                        $elemento['Plano']['titulo'] . '|' .
                        $elemento['Plano']['comentario'] . '|' .
                        $elemento['Plano']['inicial'];
            }
        }
        echo $plano;
        exit;
    }

    function __save_plano($obra_id = null, $data = null, $files = null) {
        if (!empty($obra_id) && !empty($data)) {
            $this->Plano->begin();
            // Si el plano se selecciona como "inicial", busco si existe otra plano cargada como inicial para la misma obra de arte y le seteo el atributo inicial a 0.
            if (isset($data['Plano']['inicial'])) {
                if (isset($data['Plano']['id']) && (!empty($data['Plano']['id']))) {
                    $plano_inicial = $this->Plano->find('all', array('conditions' => array('Plano.id <>' => $data['Plano']['id'], 'Plano.obra_id' => $obra_id, 'Plano.inicial' => 1)));
                } else {
                    $plano_inicial = $this->Plano->find('all', array('conditions' => array('Plano.obra_id' => $obra_id, 'Plano.inicial' => 1)));
                }
                if (!empty($plano_inicial)) {
                    foreach ($plano_inicial as $plano):
                        $plano['Plano']['inicial'] = 0;
                        $this->Plano->create();
                        $this->Plano->save($plano);
                    endforeach;
                }
            }else {
                $data['Plano']['inicial'] = 0;
            }

            if (isset($files['fileUpload']['name']) && !empty($files['fileUpload']['name'])) {
                // Definimos el directorio donde se guarda la plano
                $dir = dirname(dirname(__FILE__)) . '/files/planos/';

                if (!@is_dir($dir)) {
                    if (!@mkdir($dir, 0777)) {
                        $this->Plano->rollback();
                        echo '<script>parent.resultadoUpload(4);</script> ';
                        exit;
                    }
                }
                $files['fileUpload']['name'] = utf8_encode(strtolower(utf8_decode(trim($files['fileUpload']['name']))));
                $data['Plano']['nombre'] = $files['fileUpload']['name'];

                //Verifico si el nombre de la plano ya existe para la misma obra
                if (isset($data['Plano']['id']) && (!empty($data['Plano']['id']))) {
                    $plano_obra = $this->Plano->find('all', array('conditions' => array('Plano.id <>' => $data['Plano']['id'], 'Plano.obra_id' => $obra_id, 'Plano.nombre' => $data['Plano']['nombre'])));
                } else {
                    $plano_obra = $this->Plano->find('all', array('conditions' => array('Plano.obra_id' => $obra_id, 'Plano.nombre' => $data['Plano']['nombre'])));
                }
                if (!empty($plano_obra)) {
                    $this->Plano->rollback();
                    echo '<script>parent.resultadoUpload(5);</script> ';
                    exit;
                }
            } elseif (isset($data['Plano']['id']) && (!empty($data['Plano']['id']))) {
                $plano = $this->Plano->findById($data['Plano']['id']);
                $data['Plano']['nombre'] = (!empty($plano)) ? $plano['Plano']['nombre'] : '';
            } else {
                $this->Plano->rollback();
                echo '<script>parent.resultadoUpload(6);</script> ';
                exit;
            }


            $this->Plano->create();
            if ($this->Plano->save($data['Plano'])) {
                $plano_id = $this->Plano->id;

                // Intentamos subir la plano
                // (1) Comprobamos que existe el nombre temporal del archivo
                if (isset($files['fileUpload']['tmp_name']) && !empty($files['fileUpload']['tmp_name'])) {
                    // (2) - Comprobamos que se trata de un archivo válido
                    if ($this->__mime_content_type($files['fileUpload']['name'])) {
                        $plano_ext = end(explode('.', $files['fileUpload']['name']));
                        $plano_nombre = $obra_id . '_' . $plano_id . '.' . $plano_ext;
                        // (3) Por ultimo se intenta copiar el archivo al servidor.
                        if (!copy($files['fileUpload']['tmp_name'], $dir . $plano_nombre)) {
                            $this->Plano->rollback();
                            echo '<script>parent.resultadoUpload(1);</script> ';
                            exit;
                        } else {
                            $this->Plano->commit();
                            echo '<script>parent.resultadoUpload(0);</script> ';
                            exit;
                        }
                    } else {
                        $this->Plano->rollback();
                        echo '<script>parent.resultadoUpload(2);</script> ';
                        exit;
                    }
                } elseif (isset($data['Plano']['id']) && (!empty($data['Plano']['id']))) {
                    $this->Plano->commit();
                    echo '<script>parent.resultadoUpload(0);</script> ';
                    exit;
                } else {
                    $this->Plano->rollback();
                    echo '<script>parent.resultadoUpload(3);</script> ';
                    exit;
                }
            } else {
                $this->Plano->rollback();
                echo '<script>parent.resultadoUpload(1);</script> ';
                exit;
            }
        }
    }

}
?>